import random
import time

import gradio

# 连续触发事件
# 从user_textbox chat_bot 的value传入send方法， 返回两个value 给到两个组件的value，一个组件接受的为“”
# 另一个组件接受的是两天框中的value + [{"role": "user", "content": user_input}] 本次的value。
# 然后then继续， 将chat_bot的value ，也就是所有value了， 加上回答 在给到chat_bot的value
with gradio.Blocks() as demo:
    chat_bot = gradio.Chatbot(type="messages")
    user_textbox = gradio.Textbox()


    def send(user_input, current_history):
        updated_history = current_history + [{"role": "user", "content": user_input}]
        return "", updated_history  # 清空输入框，传递新历史


    def bot(current_history):
        # 模拟思考延迟
        time.sleep(1)
        # 随机选择一个问候语作为机器人回复
        reply = random.choice(["Hello", "Hi"])
        # 添加机器人消息到历史 (role 必须是 "assistant")
        updated_history = current_history + [{"role": "assistant", "content": reply}]
        return updated_history


    user_textbox.submit(fn=send, inputs=[user_textbox, chat_bot], outputs=[user_textbox, chat_bot]) \
        .then(fn=bot,
              inputs=chat_bot,
              outputs=chat_bot)

demo.launch()
